技术干货 | 比特币点对点网络中的日蚀攻击
本文作者:刘巍然,北京航空航天大学 通信与信息系统博士,文章首发知乎「数据安全、隐私保护与密码学技术专栏」,慢雾科技公众号授权转载,原文链接:https://zhuanlan.zhihu.com/p/42446193
我们都知道,比特币是一个基于点对点网络(Peer-to-Peer Network)的去中心化数字货币系统,应用区块链完成交易的记录,使用工作量证明机制(Proof of Work)和最长链规则(Longest Chain Rule)作为共识机制,使各个节点比特币的账本达到一致性。比特币系统先天可以遭受51%攻击:当某个节点拥有全网50%以上算力的时候,其从理论上可以实现账本的篡改,从而实现所谓的双重花费(Double Spending)攻击。而51%也就成为比特币系统的安全阈值(Security Threshold)了。
然而,比特币系统的安全阈值真的为50%吗?是否有其它方法、或者在特定的假设下,可以让比特币系统的安全阈值降低到50%以下?答案当然是肯定的。其中一种实现方法叫作自私挖矿攻击(Selfish-Mining Attack),在提出此攻击的论文《Majority is not Enough: Bitcoin Mining is Vulnerable》中已经证明,理论上此种攻击可以将比特币系统的安全阈值从50%降低到33%。
We further show that the upper bound on threshold size is 1/3": the protocol will never be safe against attacks by a selfish mining pool that commands more than 33% of the total mining power of the network.
值得一提的是,这篇论文撰写于2013年,最初发表在密码学著名会议FC 2014上。现在这篇论文已经被著名期刊《Communications of the ACM》接收并于2018年正式刊出。值得注意的是,自私挖矿攻击不依赖于其它假设,只要旷工拥有超过33%的算力并实施攻击,则在比特币系统下,此攻击总可以成立。因此,这是一种非常通用的攻击行为。
除了自私挖矿攻击外,另一种可以降低安全阈值的方案就是今天介绍的这篇论文(Eclipse Attacks on Bitcoin's Peer-to-Peer Network)所引入的日蚀攻击了。与自私挖矿攻击相比,日蚀攻击对攻击者的要求更高,其需要攻击者实施网络攻击,但并不要求攻击者拥有挖矿算力。下面我们就来看一看这一攻击方法的原理简介。
点对点网络理论上期望节点与全网中的每一个节点都建立连接。但在实际中这是不可能做到的:建立可靠的TCP连接需要消耗节点的网络资源。因此,比特币系统实际上只允许一个节点接受117个连接请求,并最多向外发起8个连接。
比特币系统中的节点只能接受117个对内连接,对外发起8个连接
我们设想这样一个场景:如果一个节点接受的117个对内连接、对外发起的8个连接,其连接目标都是发起攻击的攻击者,那这是不是就意味着攻击者可以完全控制此节点所接受的信息了?事实就是如此,如果真的可以做到这一点,则攻击者就可以在被攻击节点和比特币网络中建立一个“中继”,使得此节点是能收到攻击者希望它能收到的信息。当发生此种情况时,我们称此节点被攻击者“日蚀”(Eclipse),这个词还是挺形象的~
如果一个节点建立的连接都指向攻击者,则称此节点被攻击者日蚀
如果攻击者足够强大,它不仅可以日蚀一个节点,甚至可以日蚀多个节点,从而将整个比特币网络划分成2个部分。如果真的如此,攻击者就可以用少于50%的算力发起51%的攻击了。攻击过程如下图所示。
通过日蚀实现51%攻击
假定攻击者可以将整个比特币网络划分为两个部分,左侧部分的节点总体拥有30%的算力,右侧部分的节点总体拥有30%的算力,而攻击者总体拥有40%的算力。如果攻击者可以让左右两侧的节点都接收不到相互之间的通信信息,则攻击者相当于与左侧节点建立了一个比特币子网络,而攻击者在这个子网络中拥有4/7的算力;反之,攻击者与右侧节点建立了另一个比特币子网络,攻击者在这个子网络中同样拥有4/7的算力。这样一来,攻击者虽然在全网只占有40%的算力,但在左/右两侧的子网络中却分别拥有50%以上的算力,从而实现51%攻击。
更糟糕的是,即使攻击者没有包含任何算力,其也可以通过日蚀实现双重花费攻击。具体原理如下图所示。
通过日蚀实现双重花费攻击
假定攻击者A通过日蚀将比特币网络划分成两个部分:左侧节点拥有30%的算力,右侧节点拥有70%的算力,而攻击者要与某个商人M进行数字货币交易,此商人位于左侧。此时,攻击者在左侧子网络中发起一个COIN_0-->M的交易,而在右侧子网络中发起一个COIN_0-->A的双重花费交易。由于攻击者阻断了左右两侧节点的通信能力,因此左侧节点(包括商人)并不知道交易COIN_0-->A的存在,也不知道右侧节点的存在,他们只能够看到交易COIN_0-->M。因此,商人M等到此交易所关联的区块进一步被多个区块确认后,放心地将货物发送给了攻击者A。
然而,由于右侧的旷工占有70%的算力,它们一定可以产生一个更长的区块链,并且区块链中包含交易COIN_0-->A。因此,待商人M将货物发送给攻击者A后,攻击者A停止日蚀攻击,使左侧节点看到右侧节点的区块链。由于右侧节点的区块链大概率比左侧节点长,因此左侧节点的区块链被废除,COIN_0-->M的交易也就被废除,双重花费攻击成功。
由此可见,日蚀攻击的原理很像网络安全中的中间人攻击(Man-in-the-Middle Attack),只不过在中间人攻击中,攻击者只需要阻碍两个参与方之间的通信即可。但在点对点网络中,攻击者需要阻碍参与方与网络中任何其它参与方的通信,这就提高了攻击的难度。通过深入研究比特币系统的源代码,论文作者组合利用了比特币系统中的多了漏洞,成功实现了日蚀攻击。实际攻击表明,当应用一个包含大约400个IP地址的僵尸网络,对一个在线节点发起1小时的攻击后,成功率为84%(攻击实验进行了50次)。
日蚀攻击对实际比特币节点的攻击效果
那么,如何抵御日蚀攻击呢?实际上,论文作者给出了6种防御方法,并将攻击过程、防御方法告诉了比特币开发社区。比特币开发社区迅速做出了响应,并更新了比特币系统的源代码。
日蚀攻击防御方法在比特币系统中的部署情况
相关信息
论文下载链接(USENIX Security组会委将所有论文设置为了Open Access,任何人都可以免费下载论文):https://www.usenix.org/system/files/conference/usenixsecurity15/sec15-paper-heilman.pdf
演讲视频连接(USENIX Security组委会官方也发布了演讲视频,任何人都可以免费观看):https://www.youtube.com/watch?v=J-lF0zxGpu0
以太坊是否存在日蚀攻击?
实际上,只要区块链系统中点对点网络的实现机制和比特币系统类似,就会存在日蚀攻击。因此,从离乱角度看,以太坊中也存在日蚀攻击。这方面我查询到学术领域给出了两个相关的论文:
Wüst K, Gervais A. Ethereum eclipse attacks[R]. ETH Zurich, 2016.(以太坊中的日蚀攻击)
Marcus Y, Heilman E, Goldberg S. Low-Resource Eclipse Attacks on Ethereum's Peer-to-Peer Network[J]. IACR Cryptology ePrint Archive, 2018, 2018: 236.(以太坊点对点网络中的低资源日蚀攻击)
其中,第二篇论文的第二作者就是比特币系统日蚀攻击论文的第一作者。感兴趣的可以进一步阅读这两篇论文,了解在以太坊中如何实施日蚀攻击。
往期回顾
慢雾导航
慢雾科技官网
https://www.slowmist.com/
慢雾区官网
https://slowmist.io/
慢雾 GitHub
https://github.com/slowmist
Telegram
https://t.me/slowmistteam
https://twitter.com/@slowmist_team
Medium
https://medium.com/@slowmist
币乎
https://bihu.com/people/586104
知识星球
https://t.zsxq.com/Q3zNvvF
火星号
http://t.cn/AiRkv4Gz